package Basic9;

public class J16_Calcurator {

	public static void main(String[] args) {

		// 상속, 인터페이스, 기본클래스를 이용해서
		// 사칙연산을 수행하는 계산기 프로그램 작성
		J16Add add = new J16Add();
		add.setValue(3, 7);
		System.out.println(add.toString());
		System.out.println(add.calculate());

		J16Mul mul = new J16Mul();
		mul.setValue(3, 7);
		System.out.println(mul.toString());
		System.out.println(mul.calculate());

		// +,* 연산을 위해 J16Add, J16Mul 클래스 객체를 생성했음
		// 하지만, -,/ 연산을 위해 J16Sub, J16Div객체도 생성해야 함
		// 사칙연산을 위해 불필요한 객체를 생성하는 낭비가 발생
		// 해결책 - 상위 자료형 변환 upcasting을 이용

		J16Cal c = new J16Add();
		c.setValue(10, 100);
		System.out.println(c.toString());
		System.out.println(c.calculate());

		c = new J16Mul();
		c.setValue(150, 25);
		System.out.println(c.toString());
		System.out.println(c.calculate());
		
		// +,* 연산을 위해 J16Add, J16Mul의 부모인 J16cal 객체만 생성했음
		//추후 -, / 연산을 위해 J16Sub, J16Div 객체를 생성하더라도
		//부모인 J16Cal객체만 가져다 쓰면 됨

	} // main

} // class

// 인터페이스
interface J16CalService {

	void setValue(int a, int b);

	int calculate();

}

class J16Cal implements J16CalService {

	int a;
	int b;

	public J16Cal() {
	}

	// 멤버변수의 초기화 작업은 setValue 메서드가 대신하므로
	// 생성자는 주식처리 함
	/*
	 * public J16Cal(int a, int b) { this.a = a; this.b = b; }
	 */

	public int getA() {
		return a;
	}

	public void setA(int a) {
		this.a = a;
	}

	public int getB() {
		return b;
	}

	public void setB(int b) {
		this.b = b;
	}

	@Override
	public String toString() {
		return "J16Cal [a=" + a + ", b=" + b + "]";
	}

	@Override
	public void setValue(int a, int b) {
		this.a = a;
		this.b = b;
	}

	@Override
	public int calculate() {
		return 0;
	}

}

class J16Add extends J16Cal {

	public int calculate() {
		return getA() + getB();
	}

}

class J16Sub extends J16Cal {

	public int calculate() {
		return getA() - getB();
	}

}

class J16Mul extends J16Cal {

	public int calculate() {
		return getA() * getB();
	}
}

class J16Div extends J16Cal {

	public int calculate() {
		return getA() / getB();
	}

}